package tools

import (
	"github.com/pkg/errors"
	"reflect"
)

// BindParam 将可变参数绑定到指定的变量。如果参数不够则赋予一个默认值，如果类型不匹配则返回错误
// param 参数存储指针
// args 可变参数
// index 索引
// defVal 默认值
func BindParam[Type any](param *Type, args []any, index int, defVal Type) error {
	if index >= len(args) || len(args) == 0 {
		// 没有可以绑定的参数，直接赋予默认值
		*param = defVal
		return nil
	}
	value, ok := args[index].(Type)
	if !ok {
		// 类型不匹配
		expectedType := reflect.TypeOf(*param).String()
		actualType := reflect.TypeOf(args[index]).String()
		return errors.Errorf("args[%d] 的类型不匹配：期望 %s，实际得到 %s", index, expectedType, actualType)
	}
	*param = value
	return nil
}
